<?php

namespace app\api\model\dealer;

use app\common\model\dealer\Referee as RefereeModel;
use app\task\model\User as UserModel;
use app\task\model\user\Grade as GradeModel;
use app\api\model\User as UsersModel;


/**
 * 分销商推荐关系模型
 * Class Apply
 * @package app\api\model\dealer
 */
class Referee extends RefereeModel
{
    /**
     * 隐藏字段
     * @var array
     */
    protected $hidden = [];

    /**
     * 用户创建推荐关系
     * @param $user_id
     * @param $referee_id
     * @return bool
     * @throws \think\Exception
     * @throws \think\exception\DbException
     */
    public static function createRelation1($user_id, $referee_id)
    {
        // 自分享
        if ($user_id == $referee_id) {
            return false;
        }
        // # 记录一级推荐关系
        // 判断当前用户是否已存在推荐关系
        $u_referee_id = model('user')->where('user_id',$user_id)->value('referee_id');
        if ($u_referee_id) {
            return false;
        }
        // 新增关系记录
        model('user')->where('user_id',$user_id)->setField(['referee_id'=>$referee_id]);
        $s_referee_id = model('user')->where('user_id',$referee_id)->value('referee_id');
        self::superior($s_referee_id);
        return true;
    }

    /**
     * 计算上级添加团队数量
     * */
    public static function superior($s_referee_id){
        if($s_referee_id != 0){
            $referee_id = model('user')->where('user_id',$s_referee_id)->value('referee_id');
            model('user')->where('user_id',$s_referee_id)->setInc('first_num',1);
            self::superior($referee_id);
        }
    }

    /**
     * 创建推荐关系
     * @param $user_id
     * @param $referee_id
     * @return bool
     * @throws \think\Exception
     * @throws \think\exception\DbException
     */
    public static function createRelation($user_id, $referee_id)
    {
        // 分销商基本设置
        $setting = Setting::getItem('basic');
        // 是否开启分销功能
        if (!$setting['is_open']) {
            return false;
        }
        // 自分享
        if ($user_id == $referee_id) {
            return false;
        }
        // # 记录一级推荐关系
        // 判断当前用户是否已存在推荐关系
        if (self::isExistReferee($user_id)) {
            return false;
        }
        // 判断推荐人是否为分销商
        if (!User::isDealerUser($referee_id)) {
            return false;
        }
        // 新增关系记录
        $model = new self;
        $model->add($referee_id, $user_id, 1);
        // # 记录二级推荐关系
        if ($setting['level'] >= 2) {
            // 二级分销商id
            $referee_2_id = self::getRefereeUserId($referee_id, 1, true);
            // 新增关系记录
            $referee_2_id > 0 && $model->add($referee_2_id, $user_id, 2);
        }
        // # 记录三级推荐关系
        if ($setting['level'] >= 3) {
            // 三级分销商id
            $referee_3_id = self::getRefereeUserId($referee_id, 2, true);
            // 新增关系记录
            $referee_3_id > 0 && $model->add($referee_3_id, $user_id, 3);
        }
        // # 记录四级推荐关系
        if ($setting['level'] >= 4) {
            // 四级分销商id
            $referee_4_id = self::getRefereeUserId($referee_id, 3, true);
            // 新增关系记录
            $referee_4_id > 0 && $model->add($referee_4_id, $user_id, 4);
        }
        // # 记录五级推荐关系
        if ($setting['level'] >= 5) {
            // 五级分销商id
            $referee_5_id = self::getRefereeUserId($referee_id, 4, true);
            // 新增关系记录
            $referee_5_id > 0 && $model->add($referee_5_id, $user_id, 5);
        }
        // # 记录六级推荐关系
        if ($setting['level'] >= 6) {
            // 六级分销商id
            $referee_6_id = self::getRefereeUserId($referee_id, 5, true);
            // 新增关系记录
            $referee_6_id > 0 && $model->add($referee_6_id, $user_id, 6);
        }
        // # 记录七级推荐关系
        if ($setting['level'] == 7) {
            // 七级分销商id
            $referee_7_id = self::getRefereeUserId($referee_id, 6, true);
            // 新增关系记录
            $referee_7_id > 0 && $model->add($referee_7_id, $user_id, 7);
        }
        return true;
    }

    /**
     * 新增关系记录
     * @param $dealer_id
     * @param $user_id
     * @param int $level
     * @return bool
     * @throws \think\Exception
     * @throws \think\exception\DbException
     */
    private function add($dealer_id, $user_id, $level = 1)
    {
        // 新增推荐关系
        $wxapp_id = self::$wxapp_id;
        $create_time = time();
        $this->insert(compact('dealer_id', 'user_id', 'level', 'wxapp_id', 'create_time'));
        // 记录分销商成员数量
        User::setMemberInc($dealer_id, $level);
        // 查看推荐人的团队人数
        User::seeMemberNum($dealer_id, $level);
        return true;
    }
 /**
     * 新增关系记录
     * @param $dealer_id
     * @param $user_id
     * @param int $level
     * @return bool
     * @throws \think\Exception
     * @throws \think\exception\DbException
     */
    private function add1($dealer_id, $user_id, $level = 1)
    {
        // 新增推荐关系
        $wxapp_id = self::$wxapp_id;
        $create_time = time();
        \app\common\model\user\Referee::insert(compact('dealer_id', 'user_id', 'level', 'wxapp_id', 'create_time'));
        // 记录分销商成员数量
        UsersModel::setMemberInc($dealer_id, $level);
       // User::setMemberInc($dealer_id, $level);
        // 查看推荐人的团队人数
      //  User::seeMemberNum($dealer_id, $level);
        UsersModel::seeMemberNum($dealer_id, $level);
        return true;
    }

    /**
     * 设置用户的会员等级
     * @return array|bool|false
     * @throws \Exception
     */
    private function setUserGrade()
    {
        // 用户模型
        $UserModel = new UserModel;
        // 获取所有等级
        $list = GradeModel::getUsableList(null, ['weight' => 'desc']);
        if ($list->isEmpty()) {
            return false;
        }
        // 遍历等级，根据升级条件 查询满足消费金额的用户列表，并且他的等级小于该等级
        $data = [];
        foreach ($list as $grade) {
            $userList = $this->getUpgradeUserList($grade, array_keys($data));
            foreach ($userList as $user) {
                if (!isset($data[$user['user_id']])) {
                    $data[$user['user_id']] = [
                        'user_id' => $user['user_id'],
                        'old_grade_id' => $user['grade_id'],
                        'new_grade_id' => $grade['grade_id'],
                    ];
                }
            }
        }
        // 批量修改会员的等级
      //  return $UserModel->setBatchGrade($data);
    }
    /**
     * 查询满足会员等级升级条件的用户列表
     * @param $upgradeGrade
     * @param array $excludedUserIds
     * @return false|\PDOStatement|string|\think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function getUpgradeUserList($upgradeGrade, $excludedUserIds = [])
    {
        if (!empty($excludedUserIds)) {
            $this->where('user.user_id', 'not in', $excludedUserIds);
        }
        return $this->alias('user')
            ->field(['user.user_id', 'user.grade_id'])
            ->join('user_grade grade', 'grade.grade_id = user.grade_id', 'LEFT')
            ->where(function ($query) use ($upgradeGrade) {
                $query->where('user.grade_id', '=', 0);
                $query->whereOr('grade.weight', '<', $upgradeGrade['weight']);
            })
            ->where('user.expend_money', '>=', $upgradeGrade['upgrade']['expend_money'])
            ->where('user.is_delete', '=', 0)
            ->select();
    }
    /**
     * 是否已存在推荐关系
     * @param $user_id
     * @return bool
     * @throws \think\exception\DbException
     */
    private static function isExistReferee($user_id)
    {
        return !!self::get(['user_id' => $user_id]);
    }
    /**
     * 用户是否已存在推荐关系
     * @param $user_id
     * @return bool
     * @throws \think\exception\DbException
     */
    private static function isExistReferee1($user_id)
    {
        //!!\app\api\model\R::get(['user_id' => $user_id]);
        return !!\app\common\model\user\Referee::get(['user_id' => $user_id]);
    }

}